package com.psdi.controller;

import com.psdi.element.Position;

import java.awt.*;

/**
 * 输入处理类
 * 用于管理键盘和鼠标输入
 * 提供方法来设置和获取按键状态、鼠标按键状态以及轴向输入值
 */
public class Input {
    private static final boolean[] keys = new boolean[256]; // 键盘按键状态数组
    private static final boolean[] mouseButtons = new boolean[6]; // 鼠标按键状态数组
    private static final Position LeftmousePosition= new Position();
    private static final Position RightmousePosition = new Position();

    /**
     * 设置指定按键的状态
     *
     * @param keyCode 按键代码
     * @param pressed 是否按下
     */
    public static void setKey(int keyCode, boolean pressed) {
        if (keyCode >= 0 && keyCode < keys.length) {
            keys[keyCode] = pressed;
        }
    }

    /**
     * 设置指定鼠标按键的状态
     */
    public static void setMouseButton(int button, boolean pressed) {
        if (button >= 0 && button < mouseButtons.length) {
            mouseButtons[button] = pressed;
        }
    }

    public static void setMousePosition(Point point,int button) {
        if(button == MouseButton.LEFT){
            LeftmousePosition.x = point.x;
            LeftmousePosition.y = point.y;
        }
        else if(button == MouseButton.RIGHT){
            RightmousePosition.x = point.x;
            RightmousePosition.y = point.y;
        }
    }
    /**
     * 检查指定按键是否被按下
     *
     * @param keyCode 按键代码
     * @return 如果按键被按下，返回true；否则返回false
     */
    public static boolean getKey(int keyCode) {
        return keyCode >= 0 && keyCode < keys.length && keys[keyCode];
    }

    /**
     * 获取指定轴向的输入值
     *
     * @param axis 轴向名称，例如 "horizontal" 或 "vertical"
     * @return 返回轴向的输入值，范围从 -1 到 1
     */
    public static float getAxis(String axis) {
        switch (axis) {
            case "horizontal":
                if (getKey(KeyCode.A) && getKey(KeyCode.D)) {
                    return 0f; // 同时按下A和D时，水平轴向为0
                } else if (getKey(KeyCode.A)) {
                    return -1f; // 按下A键时，水平轴向为-1
                } else if (getKey(KeyCode.D)) {
                    return 1f; // 按下D键时，水平轴向为1
                } else {
                    return 0f; // 没有按下A或D时，水平轴向为0
                }
            case "vertical":
                if (getKey(KeyCode.W) && getKey(KeyCode.S)) {
                    return 0f; // 同时按下W和S时，垂直轴向为0
                } else if (getKey(KeyCode.W)) {
                    return -1f; // 按下W键时，垂直轴向为-1
                } else if (getKey(KeyCode.S)) {
                    return 1f; // 按下S键时，垂直轴向为1
                } else {
                    return 0f; // 没有按下W或S时，垂直轴向为0
                }
            case "horizontal2":
                if (getKey(KeyCode.LEFT) && getKey(KeyCode.RIGHT)) {
                    return 0f; // 同时按下左和右箭头时，水平轴向为0
                } else if (getKey(KeyCode.LEFT)) {
                    return -1f; // 按下左箭头时，水平轴向为-1
                } else if (getKey(KeyCode.RIGHT)) {
                    return 1f; // 按下右箭头时，水平轴向为1
                } else {
                    return 0f; // 没有按下左或右箭头时，水平轴向为0
                }
            case "vertical2":
                if (getKey(KeyCode.UP) && getKey(KeyCode.DOWN)) {
                    return 0f; // 同时按下上和下箭头时，垂直轴向为0
                } else if (getKey(KeyCode.UP)) {
                    return -1f; // 按下上箭头时，垂直轴向为-1
                } else if (getKey(KeyCode.DOWN)) {
                    return 1f; // 按下下箭头时，垂直轴向为1
                } else {
                    return 0f; // 没有按下上或下箭头时，垂直轴向为0
                }
            default:
                return 0f; // 默认返回0
        }
    }

    /**
     * 检查指定鼠标按键是否被按下
     *
     * @param button 鼠标按键代码
     * @return 如果鼠标按键被按下，返回true；否则返回false
     */
    public static boolean getMouseButton(int button) {
        return button >= 0 && button < mouseButtons.length && mouseButtons[button];}

    public static Position getLeftMousePosition() {return LeftmousePosition;}
    public static Position getRightmousePosition() {return RightmousePosition;}
}
